package jvm.codeOptimization;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

/**
 * @author msi
 */
public class AutoBoxing {
    /**
     *使用了泛型，自动装箱，自动拆箱，循环遍历，变长参数5种语法糖，以及它们的反编译结果
     */
    //循环遍历
    public static void main1(String[] args) {
        List<Integer> list= Arrays.asList(1,2,3,4);
        int sum = 0;
        for (Integer integer : list) {
            sum+=integer;
        }
        System.out.println(sum);
    }
    //自动装箱，拆箱与循环遍历编译之后
//    public static void main(String[] args) {
//        List<Integer> list = Arrays.asList(1, 2, 3, 4);
//        int sum = 0;
//
//        Integer integer;
//        for(Iterator var3 = list.iterator(); var3.hasNext(); sum += integer) {
//            integer = (Integer)var3.next();
//        }
//
//        System.out.println(sum);
//    }

    //自动装箱的陷阱
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 321;
        Integer f = 321;
        Long g = 3L;
        System.out.println(c == d); //true    包装类的比较由于Integer类种定义了一个cache -128  --- 127 都会从这里那值
        System.out.println(e == f); //false
        System.out.println(c == (a + b)); //true  Integer == int
        System.out.println(c.equals(a + b)); //true  Integer.equals(int)
        System.out.println(g == (a + b)); //true   Long == int
        System.out.println(g.equals(a + b)); //false    Long.equals(int)
    }

    //去除语法糖后的反编译结果
    //鉴于包装类的 == 运算在不遇到算术运算的情况下不会自动拆箱，以及它们的equals得到不处理数据转型的关系，笔者建议在实际编码种尽量避免这样使用自动装箱与拆箱
//    System.out.println(c == d);
//    System.out.println(e == f);
//    System.out.println(c == a + b);
//    System.out.println(c.equals(a + b));
//    System.out.println(g == (long)(a + b));
//    System.out.println(g.equals(a + b));
}
